<?php
// 日期时间函数
	// checkdate(month, day, year);
		// 说明
		// 		checkdate ( int $month , int $day , int $year ) : bool
		// 		检查由参数构成的日期的合法性。如果每个参数都正确定义了则会被认为是有效的
		// 参数
		// 		month
		// 			month 的值是从 1 到 12
		// 		day
		// 			Day 的值在给定的 month 所应该具有的天数范围之内，闰年已经考虑进去了
		// 		year
		// 			year 的值是从 1 到 32767
		// 返回值
		// 		如果给出的日期有效则返回 TRUE，否则返回 FALSE
		// 范例
			var_dump(checkdate(12, 31, 2000)); // bool(true)
			var_dump(checkdate(2, 29, 2001)); // bool(false)

	// date_add();
		// 此函数是该函数的别名： DateTime::add()
		// DateTime::add();
			// DateTime::add -- date_add — 给一个 DateTime 对象增加一定量的天，月，年，小时，分钟 以及秒
			// 说明
				// 面向对象风格
					// public DateTime::add ( DateInterval $interval ) : DateTime
				// 过程化风格
					// date_add ( DateTime $object , DateInterval $interval ) : DateTime
				// 将给定的 DateInterval 对象 加到 DateTime 对象上
			// 参数
				// object
					// 仅过程化风格：由 date_create() 返回的 DateTime 类型的对象。此函数会修改这个对象
				// interval
					// DateInterval 对象
			// 返回值
				// 返回被修改的 DateTime 对象， 或者在失败时返回 FALSE
			// 范例
				// 面向对象风格
					$date = new DateTime('2000-01-01');
					$date->add(new DateInterval('P10D'));
					var_dump($date->format('Y-m-d')); // 2000-01-11

					$date = new DateTime('2000-01-01');
					$date->add(new DateInterval('PT10H30S'));
					var_dump($date->format('Y-m-d H:i:s')); // 2000-01-01 10:00:30

					$date = new DateTime('2000-01-01');
					$date->add(new DateInterval('P7Y5M4DT4H3M2S'));
					var_dump($date->format('Y-m-d H:i:s')); // 2007-06-05 04:03:02
					// 当在 DateTime 上加月的时候要注意 统一加31天
						$date = new DateTime('2000-12-31');
						$interval = new DateInterval('P1M');

						$date->add($interval);
						var_dump($date->format('Y-m-d')); // 2001-01-31

						$date->add($interval);
						var_dump($date->format('Y-m-d')); // 2001-03-03
				// 过程化风格
					$date = date_create('2000-01-01');
					date_add($date, date_interval_create_from_date_string('10 days'));
					var_dump(date_format($date, 'Y-m-d')); // 2000-01-11
			// 注释
				// 在 PHP 5.2 的版本中， 也可以使用 DateTime::modify() 方法来替代本方法

	// date_create_from_format();
		// 此函数是该函数的别名： DateTime::createFromFormat()
		// DateTime::createFromFormat();
			// DateTime::createFromFormat -- date_create_from_format — 根据给定的格式解析日期时间字符串
			// 说明
				// 面向对象风格
					// public static DateTime::createFromFormat ( string $format , string $time [, DateTimeZone $timezone ] ) : DateTime
				// 过程化风格
					// date_create_from_format ( string $format , string $time [, DateTimeZone $timezone ] ) : DateTime
				// 将 time 参数给定的日期时间字符串， 根据 format 参数给定的格式 解析为一个新的 DateTime 对象
			// 参数
				// format
					// 在解析日期时间字符串的时候使用的格式 string
					// 如果在格式字符串中包含不可识别的字符， 那么会导致解析失败，并且在返回的结构中附加一个错误信息。 可以通过 DateTime::getLastErrors() 来探查解析是否存在错误
					// 如果需要在格式字符串 format 参数中使用 上述表示格式的字符作为一个普通字符，请对其使用反斜线（\）进行转义
					// 如果格式字符串参数 format 中不包含 ! 字符， 那么没有在 format 参数中指明的字段， 在解析结果中将会被设置为系统当前时间对应的字段值
					// 如果格式字符串参数 format 包含了 ! 字符， 那么没有在 format 参数中指明的字段， 以及在 ! 左侧对应的字段， 在解析结果中将会被设置为 Unix epoch 时间对应的字段
					// The Unix epoch 为 1970-01-01 00:00:00 UTC
				// time
					// 用来表示日期时间的字符串
				// timezone
					// DateTimeZone 对象， 表示在解析日期时间字符串的时候需要使用的时区
					// 如果忽略 timezone 参数， 并且表示日期时间的字符串 time 中也不包含时区信息， 那么将会使用系统当前时区作为解析结果对象的时区
					// 如果 time 参数 是 UNIX 时间戳格式（例如：946684800）， 或者其中已经包含了时区信息（例如：2010-01-28T15:00:00+02:00）， 那么 timezone 以及系统当前时区 都将会被忽略
			// 返回值
				// 返回一个 DateTime 对象。 或者在失败时返回 FALSE
			// 范例
				// 面向对象风格
					$date = DateTime::createFromFormat('j-M-Y', '15-Feb-2009');
					var_dump($date->format('Y-m-d')); // 2009-02-15

					// 复杂用法
						var_dump('Current time: ' . date('Y-m-d H:i:s')); // Current time: 2010-04-23 10:29:35

						$format = 'Y-m-d';
						$date = DateTime::createFromFormat($format, '2009-02-15');
						var_dump("Format: $format; " . $date->format('Y-m-d H:i:s')); // Format: Y-m-d; 2009-02-15 10:29:35

						$format = 'Y-m-d H:i:s';
						$date = DateTime::createFromFormat($format, '2009-02-15 15:16:17');
						var_dump("Format: $format; " . $date->format('Y-m-d H:i:s')); // Format: Y-m-d H:i:s; 2009-02-15 15:16:17

						$format = 'Y-m-!d H:i:s';
						$date = DateTime::createFromFormat($format, '2009-02-15 15:16:17');
						var_dump("Format: $format; " . $date->format('Y-m-d H:i:s')); // Format: Y-m-!d H:i:s; 1970-01-15 15:16:17

						$format = '!d';
						$date = DateTime::createFromFormat($format, '15');
						var_dump("Format: $format; " . $date->format('Y-m-d H:i:s')); // Format: !d; 1970-01-15 00:00:00

					// 格式化字符串中包含了需要进行转义的字符
						var_dump(DateTime::createFromFormat('H\h i\m s\s','23h 15m 03s')->format('H:i:s')); // 23:15:03
				// 过程化风格
					$date = date_create_from_format('j-M-Y', '15-Feb-2009');
					var_dump(date_format($date, 'Y-m-d')); // 2009-02-15

	// date_create_immutable_from_format();
		// 此函数是该函数的别名： DateTimeImmutable::createFromFormat()
		// DateTimeImmutable::createFromFormat();
			// DateTimeImmutable::createFromFormat -- date_create_immutable_from_format — 根据给定的格式解析日期时间字符串
		// 说明
			// 面向对象风格
				// public static DateTimeImmutable::createFromFormat ( string $format , string $time [, DateTimeZone $timezone ] ) : DateTimeImmutable
			// 过程化风格
				// date_create_immutable_from_format ( string $format , string $time [, DateTimeZone $timezone ] ) : DateTimeImmutable
			// Like DateTime::createFromFormat() but works with DateTimeImmutable

	// date_create();
		// 此函数是该函数的别名： DateTime::__construct()
		// DateTime::__construct();
			// DateTime::__construct -- date_create — 返回一个新的 DateTime 对象
		// 说明
			// 面向对象风格
				// public DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
			// 过程化风格
				// date_create ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] ) : DateTime
			// 返回一个新的 DateTime 对象
		// 参数
			// time
				// 日期/时间字符串
				// 如果这个参数为字符串 "now" 表示获取当前时间。 如果同时指定了 $timezone 参数，那么获取指定时区的当前时间
			// timezone
				// DateTimeZone 对象， 表示要获取哪个时区的 $time
				// 如果省略了 $timezone 参数， 那么会使用当前时区
				// 当 $time 参数是 UNIX 时间戳 （例如 @946684800）， 或者已经包含时区信息 （例如 2010-01-28T15:00:00+02:00）的时候， $timezone 参数 和当前时区都将被忽略
		// 返回值
			// 返回一个新的 DateTime 对象实例，或者在发生错误的时候返回 过程化风格在失败时返回 FALSE
		// 错误／异常
			// 如果发生错误，会抛出 Exception
		// 范例
			// 面向对象风格
				try {
				    $date = new DateTime('2000-01-01');
				} catch (Exception $e) {
				    echo $e->getMessage();
				    exit(1);
				}
				var_dump($date->format('Y-m-d')); // 2000-01-01
				// 复杂用法
					// 指定时间，但是使用电脑的时区
					$date = new DateTime('2000-01-01');
					var_dump($date->format('Y-m-d H:i:sP')); // 2000-01-01 00:00:00-05:00

					// 指定时间和时区
					$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
					var_dump($date->format('Y-m-d H:i:sP')); // 2000-01-01 00:00:00+12:00

					// 使用当前时间以及电脑的时区
					$date = new DateTime();
					var_dump($date->format('Y-m-d H:i:sP')); // 2010-04-24 10:24:16-04:00

					// 使用当前时间和指定的时区
					$date = new DateTime(null, new DateTimeZone('Pacific/Nauru'));
					var_dump($date->format('Y-m-d H:i:sP')); // 2010-04-25 02:24:16+12:00

					// 使用 UNIX 时间戳作为时间，请注意这里的生成的 DateTime 对象对应的是 UTC 时区
					$date = new DateTime('@946684800');
					var_dump($date->format('Y-m-d H:i:sP')); // 2000-01-01 00:00:00+00:00

					// 指定一个无效的时间，会自动对应到有效的时间
					$date = new DateTime('2000-02-30');
					var_dump($date->format('Y-m-d H:i:sP')); // 2000-03-01 00:00:00-05:00
			// 过程化风格
				$date = date_create('2000-01-01');
				if (!$date) {
				    $e = date_get_last_errors();
				    foreach ($e['errors'] as $error) {
				        echo "$error\n";
				    }
				    exit(1);
				}
				var_dump(date_format($date, 'Y-m-d')); // 2000-01-01


	// date_create_immutable();
		// 此函数是该函数的别名： DateTimeImmutable::__construct()
		// DateTimeImmutable::__construct();
			// DateTimeImmutable::__construct -- date_create_immutable — 返回一个新的 DateTimeImmutable 对象
		// 说明
			// 面向对象风格
				// public DateTimeImmutable::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
			// 过程化风格
				// date_create_immutable ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] ) : DateTimeImmutable
			// Like DateTime::__construct() but works with DateTimeImmutable.

	// date_date_set();

?>